package com.edee.bigday.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 使用RabbitMQ：
 *  1、引入amqp场景：RabbitAutoConfiguration就会自动生效；
 *  2、在容器中自动配置了以下组价：
 *      CachingConnectionFactory、RabbitTemplate、AmqpAdmin、RabbitMessagingTemplate
 *      所有属性都是"spring.rabbitmq"开头；
 *          @ConfigurationProperties(prefix = "spring.rabbitmq")
 *          public class RabbitProperties
 *  3、在配置文件中配置"spring.rabbitmq"开头的配置：
 *      spring.rabbitmq.host=192.168.56.10
 *  4、开启RabbitMQ功能：
 *      @EnableRabbit
 *  5、监听消息，使用：@RabbitListener
 *      @RabbitListener：标注在方法或类上（监听指定队列即可）；
*       @RabbitHandler：只能标注在方法上（重载方法，区分不同类型的消息）；
 *
 *  6、本地事务失效问题：
 *             在一个事务中调用其它事务中的方法，其它事务的任何设置都是无效的，只能使用当前事务的设置。
 *             因为事务是用代理对象来控制的。如果想要使被调用方法的事务生效，可以使用XxxService.xx()形式调用方法。
 *             即：同一个对象内，事务方法互调，默认失效，原因就是绕过了代理对象，没有使用代理对象。
 *
 *             解决方法：使用代理对象调用目标事务方法。
 *                 ① 引入aop-starter：spring-boot-starter-aop，其中有aspectj--更强大的动态代理；
 *                     D:\Soft-Dellvostro\Soft\Java\bigday\bigday-order\pom.xml：
 *                         <dependency>
 *                             <groupId>org.springframework.boot</groupId>
 *                             <artifactId>spring-boot-starter-aop</artifactId>
 *                         </dependency>
 *                 目的是为了使用aspectj：
 *                     <dependency>
 *                         <groupId>org.aspectj</groupId>
 *                         <artifactId>aspectjweaver</artifactId>
 *                         <version>1.9.6</version>
 *                         <scope>compile</scope>
 *                     </dependency>
 *                 ② 添加@EnableAspectJAutoProxy(exposeProxy = true)，开启aspectj动态代理功能。以后所有的动态代理都是由aspectj创建的（之前都是JDK默认的动态代理创建），即使没有接口，aspectj也可以创建动态代理。
 *                     exposeProxy = true：对外暴露代理对象。
 *                 ③ 使用代理对象进行本类互调。
 *                 ④ 使用AopContext.currentProxy获取代理对象。
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableTransactionManagement(proxyTargetClass = true)
@EnableRedisHttpSession
@EnableRabbit
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class BigdayOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(BigdayOrderApplication.class, args);
    }

}
